home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene Storm
/
Scene Storm - Volume 1.iso
/
coding
/
asm
/
games
/
blockscroller
/
block.scroll.s
< prev
next >
Wrap
Text File
|
1980-01-03
|
9KB
|
363 lines
;-------------------------------------------------------------------------
; BLOCK-SCROLLER
;-------------------------------------------------------------------------
; Programmed by Lars Haugseth 9/12-92 - PAL only -
;-------------------------------------------------------------------------
; CONSTANTS
;-------------------------------------------------------------------------
EXECBASE = 4
CUSTOMBASE = $DFF000 ; Custom-chips register offset
OpenLibrary = -408 ; Library function offsets
CloseLibrary = -414
VBeamPos = -384
SW = 44 ; Width of screen in bytes
SH = 256 ; Height of screen in pixels
MX = 32 ; Maximum pages of scrolling
;-------------------------------------------------------------------------
; MACROS
;-------------------------------------------------------------------------
WRAST: MACRO ; Wait for a specific rasterpos.
movem.l d0-a6,-(SP)
move.l GFXBASE,a6
\@1 jsr VBeamPos(a6)
cmp.w #\1,d0
bne.s \@1
movem.l (SP)+,d0-a6
ENDM
WBLIT: MACRO ; Wait for the blitter to finish
btst #6,$02(a5)
bne.s \@1
bra.s \@2
\@1 nop
nop
btst #6,$02(a5)
bne.s \@1
\@2
ENDM
;-------------------------------------------------------------------------
; PROGRAM
;-------------------------------------------------------------------------
SECTION "code",code_c
STARTPROG:
move.l EXECBASE,a6 ; Open graphics.library
lea GFXNAME,a1
moveq #0,d0
jsr OpenLibrary(a6)
move.l d0,GFXBASE
beq EXIT
lea CUSTOMBASE,a5
move.l GFXBASE,a6
move.l $26(a6),OLDCOPPERLIST ; Save copperlist
move.w $1C(a5),OLDINTERRUPTS ; Save enabled interrupts
move.w $02(a5),OLDDMACONTROL ; Save dmacontrol
move.w #$87E0,$96(a5) ; Enable some DMAs
move.w #$7FFF,$9A(a5) ; Disable all interrupts
;-------------------------------------------------------------------------
INITMAP:
lea SCROLLMAP,a0
moveq #0,d7
IMAP1: cmp.w #320,d7
blt.s IMAP2
bsr GETRANDOM
bra.s IMAP3
IMAP2: move.w d7,d0
IMAP3: move.w d0,(a0)+
addq #1,d7
cmp.w #(SW*8)*MX,d7
bne.s IMAP1
;-------------------------------------------------------------------------
INITCOPPER: ; Initialize copperlist
lea COLOURS,a0 ; Insert palette
lea COP1PALETTE+2,a1
move.w #31,d7
ICOP1: move.w (a0)+,(a1)
addq.w #4,a1
dbf d7,ICOP1
move.l #BLANKS,d0 ; Insert blank sprites
move.w d0,COP1SPRITES+06
move.w d0,COP1SPRITES+14
move.w d0,COP1SPRITES+22
move.w d0,COP1SPRITES+30
move.w d0,COP1SPRITES+38
move.w d0,COP1SPRITES+46
move.w d0,COP1SPRITES+54
move.w d0,COP1SPRITES+62
swap d0
move.w d0,COP1SPRITES+02
move.w d0,COP1SPRITES+10
move.w d0,COP1SPRITES+18
move.w d0,COP1SPRITES+26
move.w d0,COP1SPRITES+34
move.w d0,COP1SPRITES+42
move.w d0,COP1SPRITES+50
move.w d0,COP1SPRITES+58
move.l #SCROLLPLANES+(0*SW),d0 ; Insert Bitplane pointers
move.l #SCROLLPLANES+(1*SW),d1
move.l #SCROLLPLANES+(2*SW),d2
move.l #SCROLLPLANES+(3*SW),d3
move.l #SCROLLPLANES+(4*SW),d4
add.l d5,d0
add.l d5,d1
add.l d5,d2
add.l d5,d3
add.l d5,d4
move.w d0,COP1PLANE1+6
move.w d1,COP1PLANE2+6
move.w d2,COP1PLANE3+6
move.w d3,COP1PLANE4+6
move.w d4,COP1PLANE5+6
swap d0
swap d1
swap d2
swap d3
swap d4
move.w d0,COP1PLANE1+2
move.w d1,COP1PLANE2+2
move.w d2,COP1PLANE3+2
move.w d3,COP1PLANE4+2
move.w d4,COP1PLANE5+2
move.l #COPPERLIST,$80(a5) ; Start copperlist
clr.w $88(a5)
;-------------------------------------------------------------------------
MAINLOOP:
WRAST $110 ; Wait for rasterpos $111
WRAST $111
move.w #$722,$180(a5) ; Scroll screen, and set
bsr SCROLLER ; a red background colour
move.w #$000,$180(a5) ; to measure time
btst #6,$BFE001 ; Loop until LMB is pressed
bne.s MAINLOOP
;-------------------------------------------------------------------------
EXITPROGRAM:
move.l EXECBASE,a6 ; Close graphics.library
move.l GFXBASE,a1
jsr CloseLibrary(a6)
EXIT: lea CUSTOMBASE,a5 ; Restore old values and exit
or.w #$8000,OLDDMACONTROL
or.w #$8000,OLDINTERRUPTS
move.w OLDDMACONTROL,$96(a5)
move.w OLDINTERRUPTS,$9A(a5)
move.l OLDCOPPERLIST,$80(a5)
clr.w $88(a5)
moveq #0,d0
rts
;-------------------------------------------------------------------------
GETRANDOM:
moveq #0,d0 ; Get a 'random' byte
moveq #0,d1
move.b $DFF007,d0
move.b $BFD800,d1
eor.b d1,d0
rts
;-------------------------------------------------------------------------
SCROLLER: ; Scrolling routine
btst #2,$DFF016 ; Skip if RMB is pressed
beq.w SCRLX
move.w SCROLLPOS,d1 ; Lowest 4 bits into BPLCON1
and.w #15,d1
sub.w #15,d1
neg d1
mulu #$11,d1
move.w d1,COP1SCROLL+2
move.w SCROLLPOS,d5 ; Add words to Bitplane-pointers
lsr.w #4,d5
add.w d5,d5
and.l #$FFFE,d5
move.l #SCROLLPLANES+(0*SW),d0 ; Update pointers in
move.l #SCROLLPLANES+(1*SW),d1 ; copperlist
move.l #SCROLLPLANES+(2*SW),d2
move.l #SCROLLPLANES+(3*SW),d3
move.l #SCROLLPLANES+(4*SW),d4
add.l d5,d0
add.l d5,d1
add.l d5,d2
add.l d5,d3
add.l d5,d4
move.l d0,COPYADR ; Store address where new
add.l #SW-2,COPYADR ; blocks are to copied
move.w d0,COP1PLANE1+6
move.w d1,COP1PLANE2+6
move.w d2,COP1PLANE3+6
move.w d3,COP1PLANE4+6
move.w d4,COP1PLANE5+6
swap d0
swap d1
swap d2
swap d3
swap d4
move.w d0,COP1PLANE1+2
move.w d1,COP1PLANE2+2
move.w d2,COP1PLANE3+2
move.w d3,COP1PLANE4+2
move.w d4,COP1PLANE5+2
bsr COPYBLOCK ; Copy a block at right edge
cmp.w #8*SW*(MX-1),SCROLLPOS ; Scroll 1 pixel left
bge.s SCRLX
addq.w #1,SCROLLPOS
SCRLX: rts
;-------------------------------------------------------------------------
COPYBLOCK: ; Copy a block onto screen
lea SCROLLMAP,a0 ; Get block number from
add.w SCROLLPOS,a0 ; the map
add.w SCROLLPOS,a0
move.w (a0),d0
lea BLOCKS,a0 ; Calculate address for
mulu #160,d0 ; the block data
add.l d0,a0
move.w SCROLLPOS,d1 ; Calculate address that
and.l #15,d1 ; the block is copied into
mulu #5*16*SW,d1
move.l COPYADR,a1
add.l d1,a1
lea CUSTOMBASE,a5 ; Blit block onto screen
WBLIT
move.l a0,$50(a5) ; BLTAPTR
move.l a1,$54(a5) ; BLTDPTR
move.l #$0000002A,$64(a5) ; BLTAMOD BLTDMOD
move.l #$09F00000,$40(a5) ; BLTCON0 BLTCON1
move.l #$FFFFFFFF,$44(a5) ; BLTAFWM BLTALWM
move.w #$1401,$58(a5) ; BLTSIZE
WBLIT
rts
;-------------------------------------------------------------------------
; PUBLICMEM STORAGE
;-------------------------------------------------------------------------
SECTION "publicdata",data_c
OLDCOPPERLIST: dc.l 0
OLDINTERRUPTS: dc.l 0
OLDDMACONTROL: dc.l 0
SCROLLPOS: dc.w 0 ; Scrollposition in pixels
COPYADR: dc.l 0 ; Where to copy new blocks on screen
COLOURS: dc.w $000,$FFF,$EEE,$DDD,$CCC,$BBC,$AAB,$99A ; Palette
dc.w $889,$777,$666,$555,$444,$333,$222,$111
dc.w $F87,$E65,$C43,$911,$800,$600,$400,$300
dc.w $500,$B98,$DB9,$FDC,$846,$956,$A67,$A79
SCROLLMAP: dcb.w (SW*8)*MX,0 ; Block map
GFXBASE: dc.l 0
GFXNAME: dc.b "graphics.library",0
;-------------------------------------------------------------------------
; COPPERLIST
;-------------------------------------------------------------------------
SECTION "chipdata",data_c
COPPERLIST: dc.w $008E,$2C81,$0090,$2CC1 ; DisplayWindow
dc.w $0092,$0030,$0094,$00D0 ; DataFetch
dc.w $0108,$00B2,$010A,$00B2 ; BitplaneModulo
dc.w $0102,$0000,$0104,$0000 ; BPLCON1 & BPLCON2
COP1SPRITES: dc.w $0120,$0000,$0122,$0000 ; Sprite pointers
dc.w $0124,$0000,$0126,$0000
dc.w $0128,$0000,$012A,$0000
dc.w $012C,$0000,$012E,$0000
dc.w $0130,$0000,$0132,$0000
dc.w $0134,$0000,$0136,$0000
dc.w $0138,$0000,$013A,$0000
dc.w $013C,$0000,$013E,$0000
COP1PALETTE: dc.w $0180,$0000,$0182,$0000 ; Palette
dc.w $0184,$0000,$0186,$0000
dc.w $0188,$0000,$018A,$0000
dc.w $018C,$0000,$018E,$0000
dc.w $0190,$0000,$0192,$0000
dc.w $0194,$0000,$0196,$0000
dc.w $0198,$0000,$019A,$0000
dc.w $019C,$0000,$019E,$0000
dc.w $01A0,$0000,$01A2,$0000
dc.w $01A4,$0000,$01A6,$0000
dc.w $01A8,$0000,$01AA,$0000
dc.w $01AC,$0000,$01AE,$0000
dc.w $01B0,$0000,$01B2,$0000
dc.w $01B4,$0000,$01B6,$0000
dc.w $01B8,$0000,$01BA,$0000
dc.w $01BC,$0000,$01BE,$0000
COP1PLANE1: dc.w $00E0,$0000,$00E2,$0000 ; Bitplane pointers
COP1PLANE2: dc.w $00E4,$0000,$00E6,$0000
COP1PLANE3: dc.w $00E8,$0000,$00EA,$0000
COP1PLANE4: dc.w $00EC,$0000,$00EE,$0000
COP1PLANE5: dc.w $00F0,$0000,$00F2,$0000
COP1SCROLL: dc.w $0102,$0000 ; FineScrolling BPLCON1
dc.w $2C07,$FFFE,$0100,$5200 ; Turn on bitplanes at line $2C
dc.w $FFDF,$FFFE ; Wait below line $100
dc.w $2C07,$FFFE,$0100,$0000 ; Turn off bitplanes at $12C
dc.w $FFFF,$FFFE ; End copperlist
;-------------------------------------------------------------------------
; CHIPMEM STORAGE
;-------------------------------------------------------------------------
SCROLLPLANES: dcb.b 5*SW*(SH+MX),0 ; Scroll bitplanes
incdir "source.s:" ; Where to load includes
BLOCKS: incbin "blocks.scroll.raw" ; Block image data
BLANKS: dc.l 0,0 ; Blank sprite
;-------------------------------------------------------------------------